/**
 * @author：anlzou
 * @Date：Created in7:52 2021/4/13
 * @Github：https://github.com/anlzou
 * @Description：
 */
package com.anlzou.logic;

import com.anlzou.utils.CreateDir;

import java.io.*;
import java.util.List;

/**
 *     练习：
 *         1. 将存有多个Student对象的集合序列化操作，保存到list.txt 文件中。
 *         2. 反序列化list.txt ，并遍历集合，打印对象信息。
 *
 *     步骤：
 *         1. 创建集合，用来保存Student
 *         2. 向集合中添加Student对象。
 *         3. 创建ObjectOutputStream序列化流，用来写。
 *         4. 调用writeObject方法，向文件中写集合对象。
 *         5. 释放资源。
 *         6. 创建ObjectInputStream反序列化流对象，用来读取
 *         7. 调用readObject方法，从文件中读取对象。
 *         8. 将读取到的集合进行遍历，并输出结果。
 *
 *     注意：如果想要将多个对象保存在文件中，最好的一个方式可以将多个对象放入到一个集合中，然后直接将集合写到文件中。
 */
public class Serialization {
    private String filePathName;

    public Serialization(){}

    public Serialization(String filePathName){
        this.filePathName = filePathName;
    }

    public void setFilePathName(String filePathName) {
        this.filePathName = filePathName;
    }

    /**序列化*/
    public Boolean serialize(Object object, String filePathName){
        if (filePathName.lastIndexOf("/") != -1){//有文件路径
            //判断文件夹是否存在，不存在则创建
            String dirName = filePathName.substring(0,filePathName.lastIndexOf("/"));
            new CreateDir(dirName);
        }

        try {
            //1. 创建序列化流，用来写
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePathName));
            //2. 写入序列流
            oos.writeObject(object);
            //3. 释放资源。
            oos.close();

            return true;
        }catch (IOException ioException){
            ioException.printStackTrace();
        }
        return false;
    }

    /**重构序列化*/
    public Boolean serialize(List<Object> list, String filePathName){
        if (filePathName.lastIndexOf("/") != -1){//有文件路径
            //判断文件夹是否存在，不存在则创建
            String dirName = filePathName.substring(0,filePathName.lastIndexOf("/"));
            new CreateDir(dirName);
        }

        try {
            //3. 创建ObjectOutputStream序列化流，用来写。
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePathName));
            //4. 调用writeObject方法，向文件中写集合对象。
            oos.writeObject(list);
            //5. 释放资源。
            oos.close();

            return true;
        }catch (IOException ioException){
            ioException.printStackTrace();
        }
        return false;
    }


    /**反序列化*/
    public Object deserialize(String filePathName){
        try {
            //读入文件，反序列化
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePathName));
            //使用readObject读对象
            Object object = ois.readObject();
            //关闭IO流
            ois.close();

            return object;
        }catch (IOException ioe){
            ioe.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**反序列化列表*/
    public List<Object> deserializeList(String filePathName){
        try {
            //6. 创建ObjectInputStream反序列化流对象，用来读取
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePathName));
            //7. 调用readObject方法，从文件中读取对象。
            List<Object> list = (List<Object>) ois.readObject();
            ois.close();
            return list;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
